package com.xbongbong.pro.domain.entity.ext;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.xbongbong.pro.statistic.enums.StatisticsTypeEnum;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import org.hibernate.validator.constraints.Length;

import javax.validation.constraints.NotNull;
import java.io.Serializable;

/**
 *
 * @author 梁鲁江
 * @date 2019/1/15 14:23
 * @since v1.0
 * @version v1.0
 */
@Getter
@Setter
@ToString
public class ChartEntityEtx implements Serializable{
    private static final long serialVersionUID = -1767761726215530353L;
    /**
     * 是否有查询条件；1：是；0:否；
     */
    private Integer hasSearch;

    /**
     * 主键id
     */
    private Long id;
    /**
     * 公司id
     */
    private String corpid;
    /**
     * 分类id数组
     */
    private JSONArray category;
    /**
     * 别名
     */
    private String alias;
    /**
     * 指标类型：1系统指标,2自定义指标
     */
    protected Integer statisticsType;
    /**
     * 系统指标枚举code，用于直接定位系统指标，处理特殊逻辑更方便
     */
    private String systemCode;
    /**
     * 前端生成的唯一标识（保存报表是批量保存，需要把新增后生成的主键id与该值对应）
     */
    private String uuid;
    /**
     * 是否开启：0关闭,1开启
     */
    protected Integer enable;
    /**
     * 报表类型，用枚举维护
     */
    @NotNull(message = "报表类型不能为空1")
    protected Integer chartType;
    /**
     * 是否发布到首页：0否,1是
     */
    protected Integer publish;
    /**
     * 报表名称
     */
    @Length(min = 1, max = 20, message = "entity.msg.chartEntityEtx.name.Length")
    private String name;
    /**
     * 报表英文名称名称
     */
    @Length(min = 1, max = 50, message = "entity.msg.chartEntityEtx.nameEn.Length")
    private String nameEn;
    /**
     * 报表名称
     */
    private String oldName;
    /**
     * 指标简介
     */
    @Length(max = 500)
    private String memo;
    /**
     * 指标/图表图标
     */
    private String icon;
    /**
     * 颜色，16进制色，如 #FF0000
     */
    private String color;
    /**
     * 1单表，0多表
     */
    private Integer single;
    /**
     * 业务类型,主要用于对系统指标的业务分类做标记，格式为：[1,2]
     */
    private String refTypes;
    /**
     * 统计方式
     * @see com.xbongbong.paas.enums.AggTypeEnum
     */
    private Integer statisticsWay;
    /**
     * 单位（系统指标的单位可默认，如合同金额为“元”）
     */
    private String unit;
    /**
     * 排序字段
     */
    private Integer sort;
    /**
     * 创建者id
     */
    private String creatorId;
    /**
     * 创建时间
     */
    private Long addTime;
    /**
     * 更新时间
     */
    private Long updateTime;
    /**
     * 删除标记
     */
    private Integer del;
    /**
     * 报表权限+数据权限dataPermissionAttr
     * {"export": 0, "visible": 0, "exportRule": {"dep": [], "role": [], "type": 2, "user": []}, "visibleScopeRule": {"dep": [], "role": [], "type": 2, "user": []}, "visibleScopeEnable": 0, "exportAdvanceEnable": 0
     * , "dataPermissionAttr" : {"attr": "creatorId", "originalAttr" : "creatorId_1"}}
     */
    private JSONObject permissions;
    /**
     * 用于存放报表的共用配置：操作权限，表头冻结，格式：[{}]
     * @link ExplainsPojo
     */
    private JSONObject  explains;
    /**
     * 筛选条件 格式：[{}]
     */
    private JSONArray filter;
    /**
     * 分类：X轴上的分组，单选，格式为{"attr": "name", "sumWay": 1, "attrType":1}
     * 内部JSONObject推荐转换为 ChartFieldAttrPojo (继承自FieldAttrEntity)使用
     */
    private JSONArray chartClassify;
    /**
     * 系列：在分类的基础上，对分类字段的值再次进行分组，可多选.格式为：[{"attr": "name", "sumWay": 1, "attrType":1}]
     */
    private JSONArray  chartSeries;
    /**
     * 值：分类与系列组成分组，指标为需要统计的数据，值与Y轴对应；只有数字字段可以作为指标，另外系统自带的计数也可以；可多选，格式为：[{"attr": "name", "sumWay": 1, "attrType":1}]
     */
    private JSONArray  chartValue;
    /**
     * 联动：关联其他报表id数组，即当前表的主键，格式为：[1,2]。数据查询表不能主动联动
     */
    private JSONArray linkIds;
    /**
     * 单个图表的查询条件
     */
    private JSONArray search;
    /**
     * 主表数据来源，只能有一个，代表主驱动表 格式为：{"appId":1,"menuId":2,"linkAttr":"text_1"}
     */
    private JSONObject  driverSources;
    /**
     * 从表数据源，最多两个 [{"appId":1,"menuId":2,"linkAttr":"text_1"}, {"appId":2,"menuId":1,"linkAttr":"text_1"}]
     */
    private JSONArray slaveSources;
    /**
     * 展示字段[{"name":"分类id","attr":"categoryName"}]
     */
    private JSONArray displayAttr;
    /**
     * 汇总字段[{"name":"","attr":""}]
     */
    private JSONArray summaryAttr;
    /**
     * 计算字段[{"name":"","attr":""}]
     */
    private JSONArray computedAttr;
    /**
     * 计算字段涉及到的数字字段[{"name":"","attr":""}]
     */
    private JSONArray computedNumAttr;

    /*
     * 汇总方式 0:小计 1：总计
     */
    private Integer sum;
    /**
     * 分组字段[{"name":"","attr":""}]
     */
    private JSONArray groupAttr;

    /**
     * 行分组字段[{"name":"","attr":""}]
     */
    private JSONArray rowGroupAttr;

    /**
     * 列分组字段[{"name":"","attr":""}]
     */
    private JSONArray colGroupAttr;
    /**
     * 统计的字段，{"name":"字段名","attr":"attr1"}。统计的数字型业务字段，如果是获取指标值(且不是求总数)的，则该条件必选
     */
    private JSONObject sourceAttr;
    /**
     * 归属人字段，{"name":"","attr":"userId"}。按照哪一个归属字段统计（如创建人、签订人等）
     */
    private JSONObject belongAttr;
    /**
     * 时间字段，{"name":"","attr":""}。按照哪一个时间范围字段进行统计（如创建时间、自定义的时间类型字段）
     */
    private JSONObject timeAttr;
    /**
     * 可展示的图表类型列表--主要兼容首页系统图表展示
     * [1,2]
     */
    protected JSONArray showTypes;

    private Integer  frozeColumDone;

    private JSONObject  frozeColum;

    private Integer  frozeRowDone;

    private String  unitValue;

    /**
     * 是否收藏 1已收藏，0未收藏
     */
    private Integer favorite;

    /**
     * 是否是图
     */
    private Boolean ifChart;

    /**
     * 是否是表
     */
    private Boolean ifTable;

    /**
     * 扩展字段，前端传入的分类id，在设置时会转为json数组格式
     */
    private Long categoryId;
    /**
     * 此字段为收藏图表列表时用到，用于标识区分几个特殊的类型，如：员工pk、部门pk、呼叫中心等
     * 1app首页特殊类，2首页右侧动态看板分类，3首页左侧分类，
     * 4图表中心系统分类，5图表中心新建的分类，6员工PK，61部门pk，7目标完成情况，8呼叫中心
     */
    private Integer categoryType;

    /**
     * 穿透展示字段[{"name":"","attr":""}]
     */
    private JSONArray penetrateAttr;

    /**
     * 判断是否可导出 1可导出 0不可导出
     */
    private Integer isExport;

    /**
     * 数据源是否修改  1 是    0否
     */
    private Integer modifySources;

    /**
     * 1：超过套餐限制
     */
    private Integer packageLimit;

    private String packageLimitMsg;
    /**
     * 数据集变更是否需要重置图表字段 （true-数据集变更需要重置，false-数据集未变更）
     */
    private Boolean dataSetEditFlag = Boolean.FALSE;
    /**
     * 1：可升级
     */
    private Integer upgrade;

    /**
     * 指标图的展示模式  1 小 2 中 3 大
     */
    private Integer displayModel;

    /**
     *  数据预警dataList
     */
    private JSONArray dataWarningList;

    private JSONArray buttonPermissionList;
    /**
     * 单个图表的样式
     **/
    private JSONObject itemStyleOption;
    /**
     * 双轴图信息
     */
    private JSONObject biaxial;
    /**
     * 双轴图右侧统计值
     */
    private JSONArray chartValueSecond;
    /**
     * 指标图副指标
     */
    private JSONArray secondTargetAttr;
    /**
     * 平均线
     */
    private Integer averageLine;
    /**
     * 数值格式
     */
    private Integer numFormat;
    /**
     * 是否金额 1是 0否
     */
    private Integer isAmount;
    /**
     * 地图信息
     */
    private JSONObject map;
    /**
     * 自定义漏斗图
     */
    private JSONObject funnel;
    /**
     * 前端地图需要信息
     */
    private String mapDistrict;
    /**
     * 图表钻取层级信息
     * 内部JSONObject对应的pojo实体为：@link ChartDrillInfoPojo
     *      即该drill可以转为List<ChartDrillInfoPojo>：List<ChartDrillInfoPojo> drillList = JsonHelperUtil.parseArray(JSON.toJSONString(drill), ChartDrillInfoPojo.class);
     *      或者也可以转为List<FieldAttrPojo>
     */
    private JSONArray drill;

    /**
     * 图表联动设置
     */
    private JSONArray chartLinkage;

    /**
     * 图表编辑页操作按钮
     */
    private JSONArray editOp;

    /**
     * 图表联动设置标记  true-显示  false-隐藏
     */
    private Boolean linkageFlag = Boolean.FALSE;

    /**
     * 图表设置与数据集设置的对比时间
     */
    private Long dataSetCompareTime;

    public ChartEntityEtx() {
        this.hasSearch = 0;
        this.statisticsType = StatisticsTypeEnum.CUSTOM_STATISTIC.getCode();
        this.favorite = 0;
    }
}
